//
//  "$Id: Net.h 54283 2012-03-15 07:43:52Z zhou_mingwei $"
//
//  Copyright (c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __NET_API3_H__
#define __NET_API3_H__

#include <stdlib.h>
#include "Types.h"
#include "Defs.h"

#ifdef __cplusplus
extern "C" {
#endif

/// \defgroup NetAPI API Net
/// 网络接口、DDNS与PPPoE的参数设置与获取。
/// @{

/// 网络数据流量统计
typedef struct NetDataStat
{
	uint64 transmittedBytes;	///< 发送数据字节总数
	uint64 receivedBytes;		///< 接受数据字节总数
	uint64 transmittedPackets;	///< 发送数据包总数
	uint64 receivedPackets;		///< 接受数据包总数
	uint32 transmittedErrors;	///< 发送错误数
	uint32 receivedErrors;		///< 接收错误数
	uint32 transmittedDroped;	///< 发送丢包数
	uint32 receivedDroped;		///< 接收丢包数
	uint32 transmittedOverruns;	///< 发送队列漫溢错误包数
	uint32 receivedOverruns;	///< 接收队列漫溢错误包数
	uint32 transmittedCarrier;	///< 发送载波错误包数
	uint32 receivedFrame;		///< 接收错误帧数
	uint32 transmittedCollisions;///<发送冲突包数
	uint32 transmittedTxqueuelens;///<发送队列长度
	uint32 interfaceSpeed;       ///<网络接口速度,单位Mbps
	char reserved[52];			///< 保留
}NetDataStat;

/// 无线网络加密类型
typedef enum WLanEncryption
{
	wlanEncryptionOff = 0,
	wlanEncryptionOn = 1,
	wlanEncryptionWEB64 = 2,
	wlanEncryptionWEB128 = 3,
	wlanEncryptionTKIP = 4,	// WPA-PSK-TKIP
	wlanEncryptionAES = 5,	// WPA-PSK-AES/CCMP
}WLanEncryption;

/// 无线网络配置,256字节
typedef struct WLanConfig
{
    int				enable : 8;
	int				linkMode : 8;	//0:auto 1:adhoc 2:Infrastructure
	WLanEncryption	encryption : 8;
	char			ssid[36];
    int				keyType : 8;	//0:Hex 1:ASCII
    int				keyID : 8;
	int				keyFlag : 8;
	char			keys[128]; 
	int				reserved[21];
}WLanConfig;


/// 无线网络访问点
typedef struct WLanAccessPoint
{
	char			ssid[36];
	int				linkMode : 8;	//0:ad-hoc 1:Infrastructure
	WLanEncryption 	encryption : 8;
	int				reserved[21];
}WLanAccessPoint;


/// 网卡类型
typedef enum NetInterfaceMedia
{
	NetInterfaceWired = 0, //有线网卡
	NetInterfaceWireless,  //无线网卡
	NetInterfaceNr	 	   //种类
} NetInterfaceMedia;

/// 网卡绑定模式
typedef enum NICBondMode
{
	nicBondBalanceRR = 0,	///< balance-rr
	nicBondActiveBackup,	///< active-backup
	nicBondBalanceXOR,		///< balance-xor
	nicBondBroadcast,		///< broadcast
	nicBond802_3ad,			///< 802.3ad
	nicBondBalanceTLB,		///< balance-tlb
	nicBondBalanceALB,		///< balance-alb
} NICBondMode;

///  网卡带宽 
typedef enum
{
    NetBandWidthAuto = 0,   ///< 自动协商
    NetBandWidth10M,        ///< 强制10M
    NetBandWidth100M,       ///< 强制100M
    NetBandWidth1000M,      ///< 强制1000M
} NetBandWidth;

/// 网卡信息，128字节
typedef struct NetInterfaceInfo
{
	char 				name[32];		///< 网卡名称
	int 				valid : 8;		///< 当前网卡是否连接
	NetInterfaceMedia	media : 8;		///< 传输媒介
	int 				type : 8;		///< 0 非绑定网卡，1 绑定网卡
	NICBondMode 		bond : 8;		///< 网卡绑定模式
	int 				speed;			///< 理论网卡速度，物理网卡支持的最高速度，单位Mbps
	int					working : 8;    ///< 网卡是否在工作
	int					hasWps: 8;	// 是否有wps功能，1表示有，0表示无
	int					reserved_bits : 16; //<保留
	int 				reserved[21];	///< 保留
}NetInterfaceInfo;


/// 网络接口，128个指针
typedef struct NetInterface
{
	/// 底层私有数据
	void *priv;


	/// 增加接口引用
	int (*addRef)(struct NetInterface *thiz);


	/// 释放接口
	int (*release)(struct NetInterface *thiz);


	/// 开启网口
	int (*up)(struct NetInterface * thiz);
	
	
	/// 关闭网口
	int (*down)(struct NetInterface * thiz);


	/// 设置主机IP地址
	int (*setHostIP)(struct NetInterface * thiz,  
		   			const char *hostIP,
                 			const char *netmask);
                 			
	/// 设置网关地址
	int (*setGateway)(struct NetInterface * thiz,
					     const char *gateway);


	/// 获取主机的IP地址
	int (*getHostIP)(struct NetInterface * thiz,
		   			 char *hostIP,
                 			 const int hlen,
                 			 char *netmask,
                 			 const int nlen);
                 			 
                 			 
	/// 获取网关地址
	int (*getGateway)(struct NetInterface * thiz,
		    			     char *gateway,
                  			     const int iGLen);


	/// 获取网络数据统计
	int (*getDataStat)(struct NetInterface * thiz, NetDataStat* state);


	/// 判断底层网络配置是否已经被重置，以便应用层决定是否使用用户指定的默认值。
	/// 底层清空配置或者使用默认配置的时候，应返回1，如果配置已经被应用层修改，则返回0。
	/// 
	/// \param [in] thiz 本接口指针
	/// \retval 1 已经被重置
	/// \retval 0  没有重置
	/// \retval <0  获取状态失败
	int (*configBeenReset)(struct NetInterface * thiz);


	/// 获取本机的Mac地址
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [out] mac Mac16进制地址的字符串，形如00:05:0e:11:12:15。
	/// \param [in] iEthMacLen MAC地址掩码长度。
	/// \retval 0  获取成功
	/// \retval <0  获取失败
	int (*getMAC)(struct NetInterface * thiz,
                 char *mac,
                 const int iEthMacLen);


	/// 设置本机的Mac地址
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [in] mac Mac16进制地址的字符串，形如00:05:0e:11:12:15
	/// \retval 0  设置成功
	/// \retval <0  设置失败
	int (*setMAC)(struct NetInterface * thiz, const char *mac);


	/// 获取DNS地址
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [in] primary 首选的DNS服务器地址字符串。
	/// \param [in] secondary 备选的DNS服务器地址字符串。
	/// \param [in] plen 长度,要大于16
	/// \retval 0  设置成功
	/// \retval <0  设置失败
	int (*getDNSAddress)(struct NetInterface * thiz, char *primary, const int plen ,char *secondary, const int slen);
	
	
	/// 设置DNS地址
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [in] primary 首选的DNS服务器地址字符串。
	/// \param [in] secondary 备选的DNS服务器地址字符串。
	/// \retval 0  设置成功
	/// \retval <0  设置失败
	int (*setDNSAddress)(struct NetInterface * thiz, const char * primary, const char * secondary);

	
	/// 获取无线网卡配置，无线网卡需要实现
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [in] config 无线网卡配置。
	/// \retval 0  获取成功
	/// \retval <0  获取失败
	int (*getWLanConfig)(struct NetInterface * thiz, WLanConfig* config);
	

	/// 获取无线网卡配置，无线网卡需要实现
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [in] config 无线网卡配置。
	/// \retval 0  获取成功
	/// \retval <0  获取失败
	int (*setWLanConfig)(struct NetInterface * thiz, const WLanConfig* config);


	/// 扫描无线网络访问点，无线网卡需要实现
	///
	/// \param [in] thiz 本接口指针
	/// \param [out]  list 指向无线网络设备结构WLanAccessPoint的数组。
	/// \param [in,out]num 输入最大个数，输出实际个数
	/// \retval <0 获取失败
	/// \retval 0 获取成功
	int (*scanWLanAccessPoint)(struct NetInterface * thiz, WLanAccessPoint* list, int * num);


	/// 获取网线连接状态
	/// 
	/// \param thiz 本接口指针
	/// \retval 0 连接正常
	/// \retval other 异常
	int (*miiDiag)(struct NetInterface * thiz);
	
	
	/// 检测IP地址是否冲突
	/// 
	/// \param thiz 本接口指针
	/// \retval 0 正常
	/// \retval other 冲突
	int (*arpCheck)(struct NetInterface * thiz);
	
	
	/// 获取网口MTU
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [out] size MTU指针，字节为单位
	/// \retval 0  获取成功
	/// \retval <0  获取失败
	int (*getMTU)(struct NetInterface * thiz, int *size);


	/// 设置网口MTU
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [in] size MTU大小，字节为单位
	/// \retval 0  设置成功
	/// \retval <0  设置失败
	int (*setMTU)(struct NetInterface * thiz, int size);


	/// 获得绑定接口子接口列表
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [out] list 指向网卡属性结构NetInterfaceInfo的数组 
	/// \param [in,out] num 输入最大个数，输出实际个数
	/// \retval 0  获取成功
	/// \retval <0  获取失败
	int (*getBondMembers)(struct NetInterface *thiz, NetInterfaceInfo *list, int* num);


	/// 绑定网络接口，绑定后需要单独配置其网络地址等属性，原物理网卡不能再配置
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] namelist 要绑定的物理网卡名称列表
	/// \param [in] number 要绑定的物理网卡数量
	/// \param [in] mode 绑定的模式
	/// 			
	/// \retval <0 操作失败
	/// \retval 0 操作成功
	int (*bond)(struct NetInterface * thiz, const char** listname, const int number, NICBondMode mode);
	
	
	/// 取消网络接口绑定，取消后需要恢复原物理网卡的配置
	///
	/// \param [in] thiz 本接口指针
	/// \retval <0 操作失败
	/// \retval 0 操作成功
	int (*unbond)(struct NetInterface * thiz);


	/// 在路由表中添加一条路由
	/// \param [in] thiz 本接口指针
	/// \param [in] address 目的网关(地址)
	/// \param [in] netmask 子网掩码
	/// \retval 0 成功
	/// \retval <0 失败
	/// \note 添加默认路由时	address 参数传"default", netmask 参数传网关	
	int (*addRoute)(struct NetInterface * thiz, const char *address, const char *netmask);


	/// 在路由表中删除一条路由
	/// \param [in] thiz 本接口指针
	/// \param [in] address 目的网关(地址)
	/// \param [in] netmask 子网掩码
	/// \retval 0 成功
	/// \retval <0 失败
	/// \note 删除默认路由时	address 参数传"default", netmask 参数传网关
	/// 	当address和netmask的值为NULL，则删除指定网卡名对应的除默认路由外的路由项
	int (*delRoute)(struct NetInterface * thiz, const char *pAddress, const char *pNetMask);


	/// 设置主机的IP地址(针对多网卡)
	/// \param [in] thiz 本接口指针
	/// \param hostip [in] 主机IP地址点分字符串
	/// \param prefixLen [in] 子网前缀
	/// \retval 0 成功
	/// \retval <0 失败
	int (*setHostIpv6)(struct NetInterface * thiz, const char *hostip, const char *prefixLen);


	/// 获取主机IP地址和掩码(针对多网卡)
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] host 主机IP地址缓冲
	/// \param [in] hostLen 主机IP地址缓冲长度
	/// \param [out] netmask 子网前缀字符串缓冲指针
	/// \param [in] maskLen 子网前缀字符串缓冲长度
	/// \retval 0 成功
	/// \retval <0 失败
	int (*getHostIpv6)(struct NetInterface * thiz, char *host, int hostLen, char *netmask, int maskLen);


	/// 设置主机网关(针对多网卡)
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] gateway 主机网关地址点分字符串
	/// \retval 0 成功
	/// \retval <0 失败
	int (*setGatewayIpv6)(struct NetInterface * thiz, const char *gateway);

	/// 获取主机网关地址(针对多网卡)
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] gateway 主机网关地址缓冲指针
	/// \param [in] len 主机网关地址缓冲长度
	/// \retval 0 成功
	/// \retval <0 失败
	int (*getGatewayIpv6)(struct NetInterface * thiz, char *gateway, int len);

	/// 设置主机DNS地址
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] primary 首选DNS服务器地址点分字符串
	/// \param [in] secondary 备选DNS服务器地址点分字符串
	/// \retval 0 成功
	/// \retval <0 失败
	int (*setDNSAddressIpv6)(struct NetInterface * thiz,const char * primary, const char * secondary);

	/// 获取主机DNS地址
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] primary 首选DNS服务器地址缓冲指针
	/// \param [in] ien首选DNS服务器地址缓冲长度
	/// \param [out] secondary备选DNS服务器地址缓冲指针
	/// \param [in] sendaryLen 备选DNS服务器地址缓冲长度
	/// \retval 0 成功
	/// \retval <0 失败
	int (*getDNSAddressIpv6)(struct NetInterface * thiz, char *primary, int len ,char *secondary, int sendaryLen);
	
	/// 获取网口的IPv6的链路地址
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [out] linklocal 链路地址缓冲指针
	/// \param [in] len 链路地址缓冲的长度，>=44Byte
	/// \retval 0 成功
	/// \retval <0 失败
	int (*getLinkLocalAddressIpv6)(struct NetInterface * thiz, char *linklocal, int len);

	/// 设置网口的当前带宽
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [in] bandWidth 网络带宽, 定义见NetBandWidth
	/// \retval 0 成功
	/// \retval <0 失败
	int (*setBandWidth)(struct NetInterface * thiz, int bandWidth);

	/// 获取网口的当前带宽及能力
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [out] bandWidth 当前网络带宽, 定义见NetBandWidth
	/// \param [out] bandWidthMask 支持的网络带宽掩码，定义见NetBandWidth,
	///              该值只有在bandWidth为NetBandWidthAuto时有效
	/// \retval 0 成功
	/// \retval <0 失败
	int (*getBandWidth)(struct NetInterface * thiz, int *bandWidth, int *bandWidthMask);

	/// 保留字节
	void* reserved[93];
} NetInterface;

/// 获取网卡支持的个数,以及对应网卡的种类和当前是否可用
///
/// \param [out]  list:指向网卡属性结构NetInterfaceInfo的数组。
/// \param [in,out]num: 输入最大个数，输出实际个数
/// \retval <0 获取失败
/// \retval 0 获取成功
int PAL_API getNetInterfaceList(NetInterfaceInfo *list, int* num);


/// 网络接口描述，32位系统下128字节
typedef struct NetInterfaceDesc
{
	const char* name;	///< 网络接口名称
	int reserved[31];	///< 保留
} NetInterfaceDesc;


/// 创建网络接口
///
/// \param [in] dest 网络接口描述结构NetInterfaceDesc指针
/// \param [out] netInterface 网络指针的指针
/// \retval <0 创建失败
/// \retval 0 创建成功
int PAL_API createNetInterface(NetInterfaceDesc *desc, NetInterface **netInterface);


/// 获取默认网络接口
///
/// \param [out] name 网络接口名称
/// \param [in] len 用来保存名称的数组长度
/// \retval <0 获取失败
/// \retval 0 获取成功
int PAL_API getDefaultNetInterface(char *name, const int len);


/// 设置默认网络接口
///
/// \param [in] name 网络接口名称
/// \retval <0 设置失败
/// \retval 0 设置成功
int PAL_API setDefaultNetInterface(const char *name);


/// @} end of group

#ifdef __cplusplus
}
#endif

#endif //__NET_API_H__

